{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# select the backend\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGOCAYAAAB1zBI9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABF4UlEQVR4nO3dd5Dc553n988AGOScASIHIpIgCZAECRIMClSi4opanbZqdXfaYMvrLbt89vls/+Er39Xd7t3Zrt3bpNXdnm93lSMlBoliEiNIgiAJggCISOScc2jXZ77di8FgeubXPd0/9Dz9flVNiYCAGcwzv9/zfJ7cUigUCgIAAEhMn+v9DwAAAKgHQg4AAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJKnf9f4HAEibb8c7e0E6c066cFFqaZFa+0mDB0j9W6WW6/0PBJAsQg6Amrt8WTp8Utq0W9p5QDp6KkLOxUsRcvr1jZAzZrg0bbw0e5I0bFD8fwBQK4QcADUdtdl/VPr1WmnDTunYKenEmQg3nenfTxo+WBo5VFoyS1qxUBpK2AFQIy2FgqslAOgZB5ln3pKeelM6fU46e76yv++RnRFDpM/dLd06p17/SgDNhJADoEdcgxw/Lf39M9K726RzF6v/XB7AGdAqrbxZ+sxdUmtfRnUAVI+QA6Bqrj0OHo+As35H+WmpSjno3Dlf+vyKGOEh6ACoBlvIAVQdcI6clB59pbYBx85dkF7fKD21WjpT4bQXAJQQcgBUxWtuXn5PWrO5tgGnxOt6/Pnf3hJbzwGgUoQcAFVtEd+2T3ppXX1HWg6dkJ5fKx04FiNHAFAJtpADqJiDzavrI3xkMWGUNH+KNHOStP4DafOe7H936x7pnW3S2OFxeCAAZEXIAVD5YuNj0upN2UZXfNDfp+6Upk+Qhg6UFk+X9h6RfvqytHFX93//4mXphbXSHfOkVk5IBlABQg6Aiqeq1myJxcHdGTFYuv9m6fxF6U9/Kh0+IY0bEWfhfGxZhB1vP+/OviPStr3SktnstAKQHWtyAGTmkZtLBentrdLlDKM4E0dLU8dJr22Utu6Vjp6UNu+WfrVGGjU0pqCyaOkjrfsgAhYAZEXIAVARj+D4PqosJo+Rbhgrnb9wZWrL4WjPYWnE0AhAWTjceGorS7ACgBJCDoCKeMFw1rDhbeCnz8bdVL55vP2dVb6Q0wuSMylIB45G2GGXFYCsWJMDoCLHTmb/sx592bArTi8e2F86dSbW1Pjm8Ur5rByfzePTkAEgC0IOgIpUcvCfA5HP0rl1tvTwnRFQ3tsRi4394WmrTIqLjetx6CCAdBFyAFSkkrNqPK3lE4t91o0XH/vCTe+oGj9Smjxa2r6/wq9NjQWgAlQZACoyelhlf95B59hp6di2+HW/vtKKhdKpc3G5Z1aDWqUB/Sv72gCaGwuPAVTE277bLyKu6O+OkD5xu3TbXOnpN2NRclYTx0h9WjgnB0B2jOQAyMwBwyMxPsV4w462TU/d+uK90odujWU1XlNz7qL0k5fjQMGs+vSJayEccgAgK0IOgIo4cNwyW9qwM7Z2d8eHAPq04qGDpF++GXdX7Tta2dd0tlk0Pb42AGRFyAFQEY+mOHCMHCIdybCd/PX346MnPHI0aQxTVQAqQ78IQEUcNBxw7l4o9c0hdPh8nRWLpMED6v+1AKSFkAOgYj7v5rY5cbN4PTlD3TRDmj9V6kttBaBCVBsAqhrNmTRauu/muGizXqaMle5dLI0YwlQVgMoRcgBUxdvIfZKxp60GDajPeTwP3irNuYFRHADVoeoA0KP1Mh9dKt1VvJuqVoYOjM+7fH6ckgwA1WgpFLjTF0D1XINcuiz94g3pqdVxknHWW8o78hk8wwdLj9wbBwYa01QAqkXIAVAzvnXcB/3tOyydOJM97DjcDBskzZ4sffZuacLIev9LATQDQg6AmnFtcuFinGa8ZrN04Jh09JR08sy1N4j7ss1hg2M7+uQx0rK50rypXN0AoHYIOQBqzpXKhQvSniPS7kPSS+9K7++Oaa1SwLlllnTrHOmGsdK4ETGaAwC1xInHAGrOAzH9W6Xp4+Nj5wFp894rIcc7szxqs+zG6/0vBZAydlcByAdjxgByRsgBAABJIuQAAIAkEXIA5IMdUwByRsgBkA/W5ADIGSEHAAAkiZADIB9MVwHIGSEHQD6YrgKQM0IOAABIEiEHQD6YrgKQM0IOgHwwXQUgZ4QcAACQJEIOgHwwXQUgZ4QcAACQJEIOgHywJgdAzgg5APLBdBWAnBFyAABAkgg5APLBdBWAnBFyAOSD6SoAOSPkAMgHIzkAckbIAZAPRnIA5IyQAwAAkkTIAZAPpqsA5IyQAyAfTFcByBkhB0A+GMkBkDNCDoB8MJIDIGeEHAD5YCQHQM4IOQDywUgOgJwRcgDkg5EcADkj5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAASSLkAACAJBFyAOSDax0A5IyQAyAfXOsAIGeEHAD5YCQHQM4IOQAAIEmEHAD5YLoKQM4IOQAAIEmEHAD5YE0OgJwRcgDkg+kqADkj5AAAgCQRcgAAQJIIOQDywZocADkj5ADIB2tyAOSMkAMAAJJEyAGQD6arAOSsX95fELVzuSCdOSedPS9duiz16SMNaJUGD4j/pk2prkxdnv64eElqaZEG9JMGDZD69aNMq1EoSP1bpWGDpPMXIuwMGSj16xszWJRpdWV64aJ0+lz8r8uxtW88pwP6U6bVlunFy1GnnrsQv/YzOqi/NNBlSqH2SoScXub8RWnXQWnrXmnvEenkmXgh20KOG+RWacggacJIafoEacYEqT8/5S45zOw/Km3eI+0+JB0/fSU4umJz+blRHjciynTmRGlgK5VeVy5flg6flDbvlnYelN7fFeXctiynIJ07L63aIB08Lk0bJ82aFCGIMi3Pje6JM1GmOw5Ih05Eg+w6wdwgu4MzYog0tVimo4dGhwflOSj63f9gv3TouHTqbJRpKeQ44AwfLE0eI82aKE0YJfWlTHuNlkLBP0o0OvfW3FC8/F40GkdPxcvY2U/P7cTggVHZjR0m3blAWjIzeni4uiF2Y/Hiu9KWvdKRUxEa/fudcY/OZTpqqLT0RumOG6PnjCv8PB44Kr3wrrRhZzynDo0OOJ3xKNnwYpnePEu6e4E0lLBzjSMnpJfWSWu3ScdOx0fbqFgn3DC7UXaZzp8q3bNIGjOcMu3Iz+VrG6Q1m6UjJ6WjpyN8d8ZBcfggaeTQ6OSsWChNGUfY6Q0IOb2h93Za+vkq6Y1NEWzKNRidcb02bLA0e5L0qTulaePr+a/tPdxAPPF6NManzpVvMMoZWhwt++zd0ZAgnstn35aeejOeU4+GVcKjEG5EXKa3zq7Xv7J3uXRJWrUxntWjJ2PUoRIDi8H848ukuxcSdMydmPc+kB57Tdp1KJ7VSnhk12W68ibpgSUxeo7GRchpYP7JeErqrx6X9h6K+eJqeSpr4mjpC/dIi6bHr5uxwnOZutf2jcel7fukCxUExo5cfG6UP3a7tHJx9OqatUzdK/77Z6V1W6WzxemTarQUG+aVN0ufXh7rTJq1TD0V9fPXpJfelU5W2BC311Ic3Vk2T/rKA9FIN2uZekT8pfekx1bFKGNPWr9+faRFM6WvfkQaMqA5y7Q3IOQ08ALYbfukP/2pdMpTKDX4KfkdHDVM+vL90uIZzdcouwy95sYBZ9+RWHNTC15L8tAy6f6bm68Bce3hdTUOOOs/qGyUsSvuHS+fL31uRYzwNFuZeu2NRxp+/c6VNTc95fd9wVTpqx+N6axmK1OX44vrpB+9GNNStWj43Fn0tNXXH47pwWYq096CGcUGfSE9yvCNx4prRGoUQwvFuf3vPS9t2dNcZ7O1jYodlv7u6Rgdq1XAMTdIT62WVr9fu0a+t5Spp1AefaW2Ace8mP61jVGulU579foRnPPS8+9Iv15bu4BjfuY37pK+/3xMgTdTmfp7X70pAo6fp1rVfa6bdx6QvvmEdPhEjT4paoqQ04AOHpN+8EJMq9R6nM2f7kDx8/vrNMs4nqdTfrE6dlCUW1jcE8dOSU++IW2v0+dvRGcvSC+vl9ZsqU+48/oTf/63t/ZsWrE38bPz7jbp6TXShQrXiWXh0PTOdun5tc0VHr0b9YfFEZxac9Dx5//Zq5Wv70H9EXIajHuwroDcWNZytKE95xrvJnr8tdqNEjUyN8Bvb4mdKbXsGbfnYvQixl+ujp546uHRjbFHG70zzWtH6sVbej2qcfBo+mXq78/bwr3I2KOD9fp23RB7+/6m3emXqXk9kwOORx3r9e06hL+1RXrj/eaoU3sTTlBpMNv2RmOcpZflOeDxI6WJo+JMDJ/14u2Q+45m61l7OuCOedKCaUqaR6xWb47RliweWRnn4nT03NsRDrvyzlbp3e3S7TcqaQ5yr66PUcHueNHrpNFxxojPbfK2/a37Yn2UQ313XOZvb4tt0D5UMFUOHC+slXYc7Hqx65LZ8Xw6/JU76mDp3Bi99ChYZ1xHeATOuy29PidlL6+LkZauLJwm3ThF+vFLXa9p8k5K15kO95766ximHHLmTYmzdNAYCDkNxCv/130Qa0ay+Kcfi6DjSs3bxN3w+AX0dnPPP3cXdLxt2lMs86ele0KqR8M8RfX+zux/xw3E6GHX/r7DS3chxz06l6k/R9+WhBcbH4sKvbuRgNZ+sR3cW2295d5b7z2S4LVm63dGD7u7kSA/x25U/Gy3+hBGpen4mQgu5crUi7EdSr60Utqwq/OQ43Ob3GB7wba38pcLOR6JcyB3mbruSLVM/ay5c1JuVNzP59jh0lcejPq3XMjxguIbb5B+60Fp7Ig4s6xjyPHPzXXNezuk8aPSLdPehpDTQNxw+CXJur7Bja6ntbzgzXPNfvk+c5d07+I4iK27kQvXpd7BtfugdMNYJcnrOtyYVjpN5Z/Bv/jPV/9e1vl2j1R4KsejaylyA/nW1myjMB7B8XkiHxyQvvNcjC74oEof+rdkVjS05Rri9hz8PcrpUYxUd7C8uSk6Kp35X78UHRpfLeLdfJ35V1+NRrt0Qnd3vAnBZTpjfLojZK4jPfXXmX/80dht5hEaBz2PLJbjuvXLD0i7D8d/l+PRHNepS8+U/zkhX6zJaaSTYo9Luw5n/ztPvi6t2x67hrxI2b0Ln4Y894YY3cnaYDkQpVqmDjnve+1BFX/fZdr+I2tQ8rbSd7Yp3Z0qhVh/kGXtwcwJ0tzJ8Zy68ncg924Un97rxsK94ywcbHyAW6qLul2uPuyzXJl6BMwfXb3XnnYaOjD74XQuU0/jlAtWKZSpp/7PlXlvPerVVqbdnFrug/8+d5f0zFsxotgV528vG3CARGNgJKdBuG7zwrijFbwcHSvE0hHjPnXWPeYs3Bt3yFnmNSQJLpg7fDzOxKmGe86lCzs9tZe1eDw07mlHT9GkWKbeVeWgkoVDt8PNDWNioWvbib2FGM3ZsV96c3MFYXxXPNdel5IaZ7ftXUyF/m9/E//rwyf/+Gud/5k/+LP4X3dy/ucvZjyLy/c1nSiOjhXSK9OudlP+2aPxv/7W/+IPO/8zDuJfWBEdJYec7k7idhG6vnGniNPlGwMhp0F4PtjTS9XUMz4VdsbEWEfi9Q1eUJipd1aIimD9Dun//mH8G1LiitvBr5odJF4s+0dfiykq3xfmkQc32Jk+VyEuUf1/f5RtSqe38YnEWXeQuMwcun16sXvE63ZIZ87GCM5z78Q0VibFO7H+40/TLdPcv6/iOUf/5Rfx80xtp5VHtPZnWBhfjqebPnl7BBbXAZkUYsrKYd7lmerUam9CyGkQXgNS6b00JaOHR8/Na3rccLSFpawVVvHwMfc+UjuLpHRRaaW8oLa0psGNj9eO+Nc+WyjrDi03WC7TckPlvZmH+LNycPZ6ms17I+Tcf1PsknIP+5X1lQVr/1lPBXgkKTV+vmqWMSr4RBcvxjb9FJ9TT+357q9qPXBLrFX0dvtbZsXvTS+OzsyefOWAwY7h9PKlWCPp4Jjq5oPehJDTIBxKql1v4J0qPsnTjY8bZN9x9fzbGdaQlF7AxHpw7VXzrX33+Sv/7ZD04JK4yXnymIwhpyX5Ys3MCzp9MeTGnXHjs9c/TBsn3bVQ+tgy6eevRk85c5lSqN3L2rDynHZp9sS4cdwfHbk+8IfXQV4Vcopl6gDEs9oYCDkNwsOaniKphqdUfM+Nh2d/837pQ0ukNZviTqGsXztVPf3WTp+NaRKPPlSyW8JfN9lireAb86Lj2+bEAlCPGPrDizLdMPz+p2K0ywcoZv7SqRbqdfy+Ui3Snn5jP1sVB7N2XEjve+o8Betp/nJrH72EwBsQcP0RchqEX4ohPdxy6IajtJW8ksA0eqi0YHp69y65jnGjmnVxa2e8psejD95eWsndNJ5+cOOe2hRgSdY1Ch7J8a4fb212QHHvtlD8ufjiTS/uzmpQayyQ90hlavyced1X3qflDugXo7/emp7ayEOfPrEtv9plAB6l6ag02u4jIjytXa4uH9A/4UDeyxByGoQbgRGDo7LLep3DikVx0eaew9FrmDlJmj4hLvbLegFf375x0qcPGEusjmvjqxa8nTtrgPPuCe828c4fpySfXOoTTH0eUZbTfUu8s+KRRMvUYfr1jdkCnHdU+dC0m2bEYmwfd+Awf+f8CI4+oTurCaOlz99T/YhnI3PAcBjPehZTS43+zJgR0ifuiJHKFHkXoN/dLtU4jDjYu5NDyGkMhJwGMmpYnL7pI9ez8I4Vv0wOOH6h3At0w+Fe9unz2XtyDjnueaTYcHgUYcrY6HllCRz3L5FmTyo2pF4n5Z1Sh+Lm9qyLjh1UF01Pt0z9/Xnh5YYd3ZepFx07ED20NK668LPqMvVIji+h9PUOWXvlPrjNi0kdzFMsV4dpjzx0Vqb/+h9ffQq3TypuO/ZB0r/5TmzT/9OvXx0AP3O39Om74r//2TeuPRTPPwtfs+F3xAvsUyxTP6euEzsL5F9/WLppZvy384jX3P3Ffx+//vtnyl+b0RV/Hl+zU8kIJeqLkNMgHFLGjZAmj80ecv7DD2LkZvGMGHFwBemesXegZB16dqXo+1hSLVOHQIe4tt5chjL5/34Z54y4d+vG2Bd7+o4vn2Kc+etKurlYeaZYpg4ct8wuHiJZ6H5HlEcWXf5L50Sj4mPvHXw6mw4o+3UVwdFfO9VydWjx8Q+FTkZyvTi73DtdGqX0mVDlAmC5aTAH+oHdHIbXm8vUz5s7fZ2FHIc+7yzrTLm7Az2K2bbDr1wnsiVCTmfXwuD6aCkUUpuJ7b08TfWLN+LuqTzOzHBPbvmCON48Va7cfXXA3/wizq+oNzfGi2dK/93D6TbIrjEcxP/996WjGUe3esrB8/c/mfZlkj7j6l/+XfYNAz3l7dG//eHOdw+lwjtM/+i7GaasasQjOF+4J6Zj0RgSrYZ7p9I0x9Sx9d/x4M/vUY6P3KqkOchNHSctmpHPbgcvUv7obWnPx/t7GzkktobncQ6Ip1JWLIyFyinz9OZHl+ZzorPXAC6Zmf5t2b7Hy7uhvBg4j/rbgdHTjmgchJwG43nh2+bWv0J3Q/WhW9O9mLM9N8ieKvF6p3pyiHLDn3LPuMTHFXj3WL2Prm8bGZseU6qla0tS5e/VZZrH9LHPKvKUY9Y77nozhzl/r/XmKzfuWhCHXqJxJF5t9D5eI+MXxVMe9ex9LJsrrVyspuBpo/nTpNvn1Tc8unHyjdvuPaY8kmP+/hzI77u5vossvWj83puiAWmGMvVZTB+7PdZ1tNQx9N+7OEY4Uy/T0qiVF2D7tOJ6fb9+5+9dJC2c1hxl2psQchqQTy7+/IpYVFyPKRYPp35qeXydZnkh3WN98JaYDqzHFmQ3xh4WHz+yecrUjYdHHnx6cXc3OVe729BH6/tAwdRHcdoH8lkTI+h4K3I9pv7uWRyLnFPcit8Zv49+L7+4UhozrD4/M6/Bcf3SP+MN8MhPk1QdvY97x7/3idjiWcug490Uv3FvzMU3S2Nc4l7yl++XFk2rbQU/YaT08PIIj83SGLdvNL09fPn82m5DHjow1jZ5YbzDVDPxs+mR1o/fXtuF1l7r45E3f15PNzYTV3VzJsWJ8J62rlXV58/jkfdH7qtP0EfPsbuqgRWK54l8+9k4XdPbIKv9aXk41dMpHiHyNIM1W8gxl5+33P7whdja7DKt9pRZTydOGh09xNJiw2YtU1+E+ORq6anVccJstWXqBt5h1AcpLp3b3GXq03V9ianv9zp8MvshoR05eDvUfGFFTP01c5n6w0cf/PDFOCiw2tOzPXrjM8Z8/5oXi7uMm7FMewNCTi/ZBvnqeumZt+KmcZ/RkPWH5uFTjwq5Z+jh1JS34FbCT/1bW6XHVsXdVKfOZQ+QHlkYPkhaOEP65O3pnhZbDTcgP3k57qTyxbFZw47DjUdvfHjb5+5Of9dPJXzQ36Ovxincx09JlzKWqRte76D0tPdnlscicRriK4dUPvl63D919GT2sOPy87o+b9j4+LLoODbLtF9vRcjpJfxTcsBZtTFudPb5JH45HXjaNySe2vK0gcOMP7zT5475xW3pVHDXlKkb4jc2xQWSPhjMpxp7JKJ9r9nF5p6w10h458SUcdLyedKsSZRpZ2XqAwB9RYEPpvRVGC5Tn1HU8WoNjy56XZgXwnp00etE3GiUTvDGFS67d7fHwZT7j0jHz8TlkC7ra+7AGxjPqYOidxX5Sg0/v5Tp1fyO+0DKVRviVGQfDuhn9fyFqzuRDouDB0ojB0eHxsdR+PoX16+UaeMj5PQy/mG5N+eXcvdh6ZdvxF1LJeOGR6jx2hvvnnBlx4vYfZn6tvG2Mi1exOlpQleCbnDdGDvgeO2Ny3T0cG4YzlKmbix8V9XOQ9KhYzFa5sa6pTga5pGbccUy9Wnf9Ii7L1NPYXkUwveAeQTS4dEjvS5Tl9+QAdLoEbEQ3ju0mm3tTTXcAvoUY1/f4g5k27U47S719FoeL653EPdH6uc1pYaQ04v5J+d7a7bsvfJ7N94gfeXBK+tuUB03xqWQ455cqqcX58nrdjwt4NDtRbCUac/5GXW5mq90aLaF77XmC2X/+vGrO44PLIkNC3QWe6cm27cAZONeMSMLtdXWCFOmNeVQQ7AByuP1AAAASSLkAACAJBFyAABAkgg5AAAgSYQcAACQJEIOAABIEiEHAAAkiZADAACSRMgBAABJIuQAAIAkEXIAAECSCDkAACBJhBwAAJAkQg4AAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAASSLkAACAJBFyAABAkgg5AAAgSYQcAACQJEIOAABIEiEHAAAkiZADAACSRMgBAABJIuQAAIAkEXIAAECSCDkAACBJhBwAAJAkQg4AAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAASSLkAACAJBFyAABAkvpd738AqlcoSIMGSEMHxX+3tMSv/b8FSS3X+x8IAL2E69A+LdKQgdK5C1GH+tettJK9Wkuh4B8teovzF6XdB6Wt+6S9R6R3t0unzl4JOQ48syZKU8dJ08dL0ydI/XlJAaBTp89JW/ZIOw7Ex+Y90vliyHGdOm64NHeKNHmMNHOCNGGU1Jc5kF6DkNNLXLgovb9beuU9aedB6cjJK+GmI4/guDcyYqg0dph0x3xpyUxpQP/r8S8HgMZz/LT0+kZpzeaoT4+eks6e7/zP9ukjDR8kjRomzZworVgo3TCWsNMbEHIanH86J05Lj70mvbFJOnlGungp+993T2T4YGn2JOlTd8YIDwA0q8uXpfd2RJ26+1DUqZXwyPiIIdJ9N0n3L5EGtNbrX4paIOQ0MP9k9h2R/upxac8h6eLl6j+X55YnjZY+f4+0aHr82gEIAJqlPvWI+MvvSY+tko6c6nwkPKt+faTFM6WvfkQaXFwLicZDyGlQlwvS9v3Sn/xEOnUmft1Tfgc93PrlB6TF02OolRcTQOrcynk940vrpB++KJ07H2tuesqdRY+O/7cPS6OGUp82ImYUG/SF/GCf9FePxVBqLQJO2+eVdOSE9L3npK17a/OSA0Cj16eXLktvbo6A43U3tar7XDd7sfJ/eiLW9aDxEHIa0MHj0vdfiEBS63E2f7oDx6UfvCAdOl77zw8AjWbbvqjzPIJTaw46W/ZKP3s1NoOgsRByGozPZ3j+nZiqcu+jHhxsvE3y8ddqN0oEAI3IwcMjOEdP1m/0+sKl2KX1xvvUqY2GE1QasMexdlv5rYztDRskjR0hTR0b2xr3HIkXzSM0WQLSqg3SHfOk+VNr8k8HgIbjhcY+B6crC6ZKc2+QfvrK1b/vXVTjRkgTRkpzJseUlKe9fEaZFzG3d/JshJx5U+IsHTQGQk4D8Uuzbnu8QFl87eOx2M1n4nib+Omz0p3z4kV9Z1tsleyKD7x68nVp3lRORwaQ5ijOs2+V7/T5NOOxw6WvPBhHc3QMOV95QJo0RhrUPwKPR9pvmys985b08rpYzHzVWsr90vod0vhR1KmNgpDTYGtx/JJkPQdnw05p+z7p8In4O94i/vHbpbsWRM/lRDfnP3hU1Scn+wRlH2wFACnxifDl6kFv/V4wLXaZupPoM3M62rhbeuHdqJs9uu6gU6pjN+y4tkPq0RyPxt92Jkbacf0RchqEewEHjkm7Dmf/O090WFNz8FicgXPfzdKPX+o+5JhHexyWCDkAUqtTPfV/rsO0Usng4gh4V55+Mz5PqZp1h9IdyM/eLQ0bfG3I8ejNvqOxaYSQ0xgIOQ3CL5EXxh09kf3vlFvg5kXFWdb0mIdfN+2WHrwl+9cFgEbnKSpfgVNu2v7PHr0STP7iD7PVsb7ewX/+1fXSgaPX/nn/cR/g6rU708b39DtALRByGmg9zrHTPVv9756FeybvfSCdyRJyCpLffw/F+mX2wVYAkALfReVOXC24bvTmDt8H2NoqvfRe3H11jUKsA/Kln6VLk3F9EXIahNfUeOFwtVr7xvyyF9Jt3Hn1grguFaIicMjiDhYAqWg7Kb5Gx3B4auuffylG259fKx06Vv6MsUuXok51x7EvIee6I+Q02Kmc1ejXV1o0I9bj/HptHEyV6ZC/0gvor+3FzoQcAIlwfVqrw069E/UnL0sD+8cWcdeZv1oTIzad1amuTzlotTFwGGCD8LCmw0o1f8/h5u6F0usbYzdBJbeU9+RrA0Cjcp1Wq+kij4z7RGMHnc27pXsWx/k5XX1tpv8bAyGnQXi6aejAyv/eTTOlT9wR5zZUE3DMZ0B4mgsAUuE1in1r3HnztL5Hb0YPkwb0L1+Xe8SH9TiNgZDTIBwyfAaDz2zI6kO3SL/1oPTd5+LMhmqmu1wJ+HROXkgAKRkxODpwPeET4UvHa7iOnDI2pqs8at7Z7qpSuPIBrdSpjYH+ewMZNSxO3/Q5C1l88g5p6CDpn32x8/nf//Evu99lNaBfHGcOAClpKe6I2nUw7pbq6OsPS4tnFP+spMljpD//g/j1t56NOwQ/tkwaPzKmnvz5LhfPM/NdWMdOdfI1FZ1Gn0SPxkDIaRB+gTzHO3ls9pDjsxjOdrFFMsu6N88dc3cVgBTr1JtnSq+s7zzk+HRi16GdKW09//OfSdPHx7IAn3vje6tWb5L2HCpzTlmLNHFUTGehMbQUCqwBbxSebvrFG9LPV9XufIeuuHdy53zpnzxU/68FAHnzguF/+x3pgwP5fD2P4HzhnqhX0RhYk9NAvB7HO6U871vv6Vx/fs8bf+S2On8hALhO+veLKScvBs6j/vb0WNsWczQMQk6D8bzw0rnS4AH1H8r1VQ4OVACQqiWzpFtm1//rjBwSF3d6AwkaByGnwXiNzPL5sSCunr2PpXOklTfV7/MDQKPsXH14uTRtXP12PHnE6J5F0sJp7KpqNIScBuQtiJ9bEQve6nGg1I1T4qX3Lbm8kABS5jrOO56+uLI+C4J9aae3mj94q9SfU+MbDiGnQfll/N1PStMn1DbozJ4kffFeacJoAg6A5uCqbs5k6cv3xzEdtar6/Hk88v6l++q/xADVYXdVA/NP5sw56dvPSW9sjG2QhR4Mp86fIn3+nlj3Y4QcAM1Un/pj/Q7pRy9KOw9KF6u8L9AdT19o/NBS6aFlseiY+rQxEXJ6AV8O98oG6Zk10qHj0tnz2cOOw83IodKyG+OE5OGD6/yPBYAGt/eI9MRrEXh8qF/WsOMg41OUfQryx2+XFkzl3r9GR8jpJQrFkzZXbZA27IwX0x8+0bj9T7Cth9FfGj4o1vZ4S6OHU6fWcdEdAPQ2vil84y7p1fXS7sPSyTPS8dPRqWzfKHqUxlNR7iCOGR6bQm6bE7+mTm18hJxexj+s46diqHX3Iemp1dLhdqd2er7Zi+BmT47dBN7OyIsIAJ1zC7j/aNSp7kA69PgSzpLZ7igulG4YEx+Dq7hIGdcP1zr0Ms4rDi7+8HZFXxTXPuR4wbJP2yytuwEAdL/7yh+uV9/ecnXImTZBuu8mOou9FburAABAkgg5AAAgSYQcAACQJEIOAABIEiEHAAAkiZADAACSRMgBAABJIuQAAIAkEXIAAECSCDkAACBJhBwAAJAkQg4AAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAASSLkAACAJBFyAABAkgg5AAAgSYQcAACQJEIOAABIEiEHAAAkiZADAACSRMgBAABJIuQAAIAkEXIAAECSCDkAACBJhBwAAJAkQg4AAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAASSLkAACAJBFyAABAkgg5AAAgSYQcAACQJEIOAABIUr88vkihIF0uSGfOSecuxH/37SMNbJUGDpBaWqSWPP4hiXG5DhogDR0U/+1y9K/9vwVRptVwOZ49Hx8XL0dZ9u8X5dqvL2VabZn6vXeZXrgUZdjqMu0vtbZSptWWqcvSdeqFi/G++/kc3F/q358yrbZM+7RIQwZKZy/E7/n997OKGrf9/eMjj7a/pVDwP6M+XKntOCB9sF86cEw6eVY6d/7qb9QN9IRR0ozx0g1j40VFeecvSrsPSdv3SfuOSO9si3ItpZphg6TZk6Sp46Rp46Xp43lJu3PxUjyfW/dKew5Lx0/HS+mQ06cYcvycjh0eZTpjgjTAjTMtSVmXL0tHTkaZ7jokHT0pnXaZXor/32U6eKA0elg8qzMnSkMHUqZdcU198oy0Za+086B0+IR0+mzUCSqFnAHSyKFRl86cII0aKvVhvL5Lfi79nO44KO3cL23aEw2y+XEcN0K6cYo0eUy8++NHRvuFrtt+t/sfHIi69VQnbb/bqgmjo+132dar7a9LyHED8e526fWN0r6j0mFXcGfL/AOKDbNfxkmjpeULpBtvoGHuyL21TbulV9fHy+gGxBVeZz89l+mQYmXnF/SOedJNM6NhxtUNsRuLl9dJm/dGmZ44LV26fO2fdWU3qFimo4dKt82Vls2N38MVfh5dqb20TtqwM8r02Kkr4aYjP5Mjh0ijh0s3z5SWz4+eNGHnai7HV96LetX/ffSUdL7YEHfU2lca4TIdJs2fKt21QBoznDLtyJ2ZN96X3toSgdHl6sa5M26Yhw+WRg2TZk2MMnWQJOxcGxjXbpVef1/af1Q6cqrrtn/4IGnkMOmGMfHuz5lc+7a/piHHn8k94cdWSe/tjEbYDUlWfmD8ct4yW3poabykzc5leuKM9Phr8UL6v8s1GOUepBGDpVmTpE/dGb1mRAPx5BvSi+viOS313LJyMJ84WvrMcmne1Hr9K3sXP5fPvS39ak2MLrqzUwmHG3d2PnNX1AGQLl2SXtsYz2pXncVyPCXoYP6xZdEwE3SiTVq/Q3rstRhl9PtfCY9CukxX3iTdfzOdx1I7teug9PNV0sZdxba/gmTRz22/O49zpI/eFuXbUCHHn8EfHmn426cjwXXWG67kG541WfpHD0iTRxf/oU34crpMPRL2jcelPYdiDr5annbxkODn75EWTSvOhTZpmXrq5BtPSNv3Sud7UKYuPvfsPn67dM+iCOnNWqYO3996Vnp3q3SmwsDY2YjZypulT99ZXAfVpGV65nw0xC+tlU5UGG7aa1sD1Ve6fX7Uqa1NXKauQz0i5sbY9UAlDXFHLsfFM6Xf/nBMEzZrmV4uSBt2xPvvUdyetv1zbpC+8qA0YWT8Xk/LtSYhx8n4vR3RGLv31pMH5x/+YS3xTf7eJ2JYsNkeIJeh5zP/5MeVp+JyXIQeHfvyA9Li6TFX30zlWhpp/MvHpX2He/YydhzVcdBxz869vGYr00MnpG89I637oLJRxq54U4Knrj+3IkYjmq1MPRLmgPP821fW3PSUG5AF06SvfjSe2WYrU5fjy+9JP3gh1ofUYgrDnUePjn/90zHt2kxlaq5DPYX6zSej7a/FvJDL1Ot0f/+TsYSlp2Xa4xnFthGcPdJfPR7zcbVojNuPYvz1EzEy1Ez8ve/YL/3lz6OHXLMyVcw9f/e5WGhXtxXnDaj0PHmkcW8NA475Z/TLN6Q1m2r7eXtDmXq9zc9eqW3AMe9ueW2D9Ks3K59KTGF336/fkZ5/p3YBx7yQ3uukvv985VM0vX604XKsvXHAcfnWqu5z3ezNNd98PEaGmkmhIL2/S/rmE7ULOKUy9aYaD5ocPNbzz9fjkOMG47/+qrbfZIk/3+7D0refjUVizeLQcel7L0hHTtShTCUdOB4v++Hjtf/8jcpBxOsavCutknViWXkh6BNvxI6CWoXSRufw8cp6afXm2gacklPnYgHz21vr8/kbkZ8d94yfWiNdqEO4c2jyjsxfr22u8Lhtn/S9X9fne/bPzDvefvZq5WumerM9h4ptv0NjofZl6l3E334uNoNct5DjYPOzVdKBo/VrLP15PRX29Jr6NE6Nxi/h82ujMa7XqEBp9O3x15ujQXYD+fYW6Z2tte0Zt+di9E6tX66uT+BvNH4X/Yy+8G7lC4wrcfB4jGh4rj/1Mm2b+jsuPfF6VOz1+nY9FfbqhlhDmXqZmrcv//DFGGmp1/frtT5rtkhvbGqOOvX0Oemnr8RIS73K1OXoEeJn3u5Z29+jzVruETiAZGmMPc82c5I0b4rUv2+swPZLlqXR8ed3j3HJrDhPI2VuOFyu5bYydsZb7lw2LuNVG7L/vVXrpdtvjG2mKXPDsXpTTK1UwnPBPmtkxaIY6vaIQnfe2iot/UBaOldJ8/PphjLLVHJ3z5iPRXB9UM7mPdLabbEN2mueUuXGwiNXXotXjhe3e6u9d6I5YLbnpQvTJ0RZeyGs61dPJ7in3ZGnA9ZsjvUk3hqdMi80dqeuKy6zuTdIj75y9e+7nMeOiC3OPn/M0/3e5erw3XF00aPFb2yMM3VKi2ZT9fYWaf3OrgOd22pvC/eC5I4+eUfnu6ddtg42JS5jt1NLZsazXY1+PankPGfulNwdv3xeROhtjG2HU7VIt8+Tnn07PnwGTHeOn4rtvjMmpnuap8vBP2Avis3K2xe9PfyL90alVUnI8aiRp3C8BTrVMnVA3r6/60a0HB+k+NWPSJPGxBkaWULOxYtRprfOkfq2JHwWzvGokLL04tw4eFF2OR908/NxRffCWmnZjVLr0HSfVTeS3oJfrkz7t0rTxklfuk96f/e1IWfZPOlTd8T2W+/8cXn5DChv6XfPu+N74ZFN18PDBqdbpm6fnu1iJMAdRIdn7+bxdv2OIee3PhSLX31QpY83cbvnM7KeWh1b+9sHHf/cXNd4e7oPDEy1TM+ej0GHciO43hHpdt7P6ZSxnYccbxX3waod7T1ydcj5hzOi1kvTJlRXplWHHP8w3YvLMow0dqT0hXuiN/bXb8YLdvdC6cO3Ri9tSzcpuzQcuG1vDI/5gLsUuXfgkZysW8X/j38UPQ2/qNX0xlyXukx3H4wdbCnyi+jFluUOTivH5fk7H49FhQ45lZRp20mf+9MddfQ7755c1tHGR1+Vnnrz2lGyxTPiPCxXYt3ZcyTejREJ72DxaGPHMFLyvzwSDYfDy/AhEXLac6/4kZXS5t3Sf/pFrOdxY3z3AmnLPmnd9mvDk0cl/P77xFkHqBR5fVO59Zy//ZEYwWk7o2VIrAHpyG2Tg6J3ELoOcdvz4dvigFWPkrnO7jgV6DJdOidOSU/R1mI73Nkojtv0D91aPPNucNdr6fw8/u//5eoM0dmgiWd7/DW9htSBNJeQ05ZY98Vphll7xB698Vyzt/DaM2/Fdkb3TNp2+hSyLUT0rqMUQ07ppNhdFYzi+MXs6emwDpwOASmGHJepGw2PElQybezKyQ2GF2e60ah06sk/D/eSUww5LtNLhZiWy7r2wBVXx8rL28LdMHtBqINkljJ1D8/BqE/fNMvVIadcmfpdbwt4Zf6+p51cpl786rVhdubdOD1+6tg4x6Rjg+Mydfl7OivFkOMyXbtdOldmpsCjM9723RXv7ms7B674azfuHoH47N1xRlbHkOOfjzv/DpAphpxCcZH1sTNdHD5ZLNMs7VK5sNSRdwP6uc4t5Pgf5R9k1gWHvu/Df8c7UNoPzXrEwg9M24WSGb5RL8bbtj/mPFPTtuvpmHT0RPa/8z99I/7XZwr8X79d3df1lJVDgHsmKXJl4/UHWXmo//N3xwvlUO4j3KsJjm6QH7xFSWq7k25/zz7HlHERHn2cQZaRnMvFMO7KLsX77Vw/egSgnH/xn688n3/8tc47kqXnvaTtvqALMWXgnnXHkNP2Nd1ZPZnm9QRtZ411sZvyPz4a/+u2+C/+sPznaK/0SwfzzrbhF4pTLq5zUjyxv1Dc9XT2XPlRW3/YH/9OXBjbFQd3P5cOoh59LBcDjp2OndZee5pLyHHvOMtanBIffe2KsX0oaruR9LJ07+I4SKzbWS8f5nQhhg7f2RJnPqTEB/N5WC7Xhfk+P0Ixh/wffphtbVRv4vDsEcSsq/+9WNNHivuMlo7rHSpSiJD0//ywfC+yN/Plej3ZQeLFw762wWXU3YLQf1Ac6fyTn9Rvh9z1LtOebG++96ZorNtPd7mc3IDcOV/6znOdfP5CBJy/+UXUxaltCvJ6RT8ztVS6VNaLujudBitE2/jjl2NULbWdVq19s3VKstbPf/S1eC694N5rbt15uqbMCvFnvC7XdXmlMxdVhRyfFnk9zlgoHR/vBJ1ayHFP6rpcSlqc0nGA7Mm1EY2opVgpZeXF8Z5i8rTBgqlXRsnMuyu8S8gjNFkCvt8P9+hSDDk9HYafPFa6c570d09Xdiide3oeQXYITY2nna9He+iF8p4ySPE59dRJLc9Xch09Z1KEnK6OTvACZp9x5hHd1EJO/3612TLuaUTXj6XPuWi6NHa49HfPxG7YjgqXo071z7PSdrLq6arcf3il9Ob50UQXHuauXZmmqpJvzUP+vgXXHx15p4o//vW3Yw1ZlnJNuFir5qkmLzb2WidPP2VWKlMKtXZ4TjPziLC3mHs3mm/Y9oLmTtvAdm1TquVaqMHn+NGLV49ieiOSr8ZxJ/OakFMsU482VpM7+lWbaCuZw/W5L14A5wqulKydxjzsVPZhKccXS1b8L0ZXUt2tYpV8az50ruP2RW8F/fTy2C795ubKrhhJuFir5rMufG/an/+s/E6ipnxWe/h9vbutuMW+75URWde3fftGmOxqRCPVIq3lN+Z1oJ7K9lZm1wNZpvZbUgw6Lb7wsraf0ktZvM7HC5a9g7BWuaNHIcfJyxfoZeWdJj4E0IuMSiltyIB4Cd2oZA05bTdpj5amjk/vjiC/EF6p77nevPnB8lbKiwmWqV8gn0SahY8z8Ed7XnjskOP1Iz60LquhA+KsnJ7cct7I5erKvpopmS/fH+c5efttpVzneLFyas+pufL2oXXVjpC/+4G0bG4sTC6tQ/F0jacCugo5A/pJN82MuriQYJn6WasmTLfnuvGLK6Wfvhyd8u6mwLwl3aM+bu9Sm67q0xJtVC3XOrnj4vWQnjYt14n013XuyC3k+OXxvHzWXVE+U8eLwO67KXasOKC41zF6aJwnknUIekD/OPvB+/CTeyN9AvGGmArJM8C5p+deypfuT7NM3UPw/G/edx9NnSA9cl+a0yueG/fIVqVruDzvPnFUrMWpZv3XxNHSF+6NRiQ1fkx8qnYlGzracz3a0ifOKfGBdl507J0oLm9fE1OuTvGWXJ8+W83W3N5QprsORvtTLW+McSfnG09Im3ZlCy0+x8ibbeZPS7NO/daz0SGvtm5bOC2OLWi7R7AQz56PhvAaHf+8OjNoQAT4akZyqwo5/kKucHzOgBcCZ2loHn9N+sTt8RKW+OXzFsashg2KdRMOWanxAzNuZPzAs06J/Lvfid5xiV+s0smy/+ffXlnY1RX35DzKlmqZusLxGUDeSppXfePexqJp0fNIsUzd6581Wdq4I3uZ+t19eLn02Gtdb5Xuavdh23UF7s31TbNc3dnwTfadlem/+urVW5J95INHbuzffjfq0Z+8LH32rmiY23ec3i/TOLt37BPk/Y64EUmNy9Snwbv96SxUf/3haFzNbefkMdKf/0H82jt+3T55isojMv/D5zr/Gj7Mrv0akpbiZgVPc6dap04dF7MzPviwo0/dGaHZSqMupTL1Dipf6HnXguKJ8MX/38+mD/r7/gvXnjvU/nBWb/6oRtUhxwuERgzNFnJcMA45vrHcO1g87Ox7b17fWNkdTR496uwo6BS4TH3IoRvkrCHHWxjLjVBkHQ1yg5Xq3VUuU0+Lej2Ye7rVpByXryuxSoe8qznPoddsy+8j3TJL2rgze5n6vfWuTN/tU23Y9EiQv3aq5erQ4tEc7yTpyPVsuaH60rvuy2F9PosbEa9vWLUxrt7pqo72dGyKjXGpTD0V56nVzkKOR83K3WdX2m3m81m62s3T2Rk8Hj1L8YycUpn6mhZfBdJZyPE7Xq5MS7vRfFmq1+k6DHkNma/L8bPa1c0HDjk+W6saLYVCdYNOfmh8voKHrfOYXvGIw4O3Sp9foWS5HJ98PXq7eWzRd0/ujvnSP31IyXIvwS+Rn9VqpwIq4Z7cohnSH3w63QbZNYZHCf/996MRyIN3vP03n0r7MkkH6X/5t3GFQB7cM/bVBimezF3iabt/851sp2rXan3j5++JiylTdeGS9NePRyDPo+33oMhHlsa0YTWqroadwFYsjPsp8kiPo4fHPSwpc0/Nw6c+oTSPHQ8+Q8bDsSlzkPOx9m2jADkU6sDigYLJ7gIqvo+uzO9elM8lpF7P55vgU5xSac/Tmx9dms/pwx6duHnWlXOgUuWF174Y2u1Vvfnn5sDo6f+UtfaNKVEvV8mjrvHdlz5Xq1o9ep28grz93Fq9eErlgSXpv5Aqzgv7hlavNq8nN/gPLolAlTo3yL4wr96LK12mniqo5iqI3sbBw2XqnY51HxmbHoczprjguOP36t1jeTSSDv6eckx1qqrj1HEe08eeIvRyjO7uw0rBvCnR9te74+iQ6rWmXuNUrT497Q34YC8PJdez53rX/Hh4Uu4dtw90/l495VHPO3ocpO67WU2hbdHqtDixuJ7h0QtHvYPQlx2m/qz6+/Pt7P5+veuhXrxGzYvpq91Z0Zv4+/MCbY88uENXr2/XjfA9i2MBaeplWmooP31X8fut19fwzMai2DnUDGXa2i8O7/P6nLq2/QtiFKcnX6PHfSPfxPqVB6UJI2v/zfrz3TwzHtBm6HGUeN3B5+6OnWT1eIA8AuedLq5Qm+GFNIcbX5jpSqge4dGN8T80Tk1Spm48fKSDK6J6vJ8egfMIrheOp3iBZLlAPnuy9LGlsbiz1tpOl10Ugf+6XCNzHfh99Hvps2687KEeP7Pb50f94hHOZjHabf+HYpSlHm2/77fzOpye7lKtSdXh1eS/98k4qK+Ww1c3zYgAlfJiw3I8tfK7n5BmjK9tmTp5f/HeOAKgWRrjEj9Hv3l/MejUsNF0wH/4Tmn+lOZpjEscbjya60sgKzkgtDs+GuEjt0WAapbGuP2aB18f4NA8vIf3hLXnZ9OjYj7KI8XjDbriqm7uZOk374s7kmpV9fnz+Nn/0n1XH+fRLCaPln7349KkGnfuPL3otr+n9+T1aHdVe6XPcOBo3HbrU4y96rqaT+yC8kvu1ekewSkFnGZrkEvl6m13PnzJu9i8nbnaH5YbCjfCXvlfOm+gWcvUR7L/4AXphbVxem61p5L6OXUP8ZGVV7bhN2uZ+tl88o3YxuxjIaotU4dPV2wuUx8Y2sxl6jrUpyD7NuujJ6VLherDjUfdvDN15c3RMDdrmfpj/Y7YxuxTzKvdHeSOp8v0oWURRl3GzVqmtuew9N3npQ07etb2u0y9wcgzDaWA09NyrUnI6Xh2y7NvS6vWx5Xs3sKXlYf6xo6IeX6HnNR3U2TlG8J91sPTa+LMFm8vz/pD80Pjw6zcYPggxmYcFeuMn3pf9/DzV+M4cW/fzVqmnu7yC+gFsR7BSfG02Gr5CgFfvueznrxlP2vY8QF/PtPIh7f9xj3Nsckgq9JBfzv2x63tWcOOp1E8Tetp78/Wcfq7N/IRCD67zYHn+KnsV4W4/Dx66Q0iHhFbUKfp797o2CnpV2viLCy3/ZWcau6RRZ8Td/8S6Y4bazvSWPOQUzogyecSvLw+Tjf1i+nzNNoa50KH+ygGxJCsG2KvFfEio2Za15CVy833hfj+JDckLk+/nD4eu2OZOix6Pt9rbryl0QuZpzXJIsNKuNz8bL62MQ6nOnwiQvrpDo2zi82LiV2eLlfvSPM0Sr0X3PfWMnXHZvWm+HCA9GF0p85c25A4gHuI38HbjYZP8fUuKjfOlOvVPFLmZ9QnGDtA+rk9cfrahqRfMSy6TMePih0wS2ZGnUCZXu3SJWnDrqhTfSqyD7dzmbpT2b5R9CiNO9w+LsXrUBbPjJ2FLmPK9Nq239doeARyWzGUHy/T9rtMXYYu1xunRtvvoFPz9T31CDkl/sQ+rtnDgh7OctLzN+sGpO3BaY1dE96l4Ua4HgvtUuMydbhxmfrFdGL2KZPu3bWFxtYIjJNGxymz/m9exO7L1MHG96bsOhSjZQ6PHnYtDUv7ZXT4dpmOGZbuQX+1LFM3Fn5G/ay60vPlp6XpAZepNxV47t1l6sWL9Ii7L1M3Iq5LXab7j0TD7FDZ0i7gjBkRO4lcBzTTQthquQV0cNxxME6MdqPsZ9f6FkfDvMHGnRtP9ft8MXT/rLoe3XkgRs2uafv7R9vvzo2fVXcg66WuIafc3H3pG23Wecx6zN2XGmRXdJRpz/k5LZWpn1NCTc9873npmbeujDx4BKdtjUjxrjVUx8+on9WW4pRfsy18rwcHybZRx2I7xchi7277c9230LaouMl2SuRRpg429IJrizKtAxqKmis1GKgdh5r+lGkybT8/SgD5yG3MGAACIQcAACSJkAMgH0xXAcgZIQcAACSJkAMAAJJEyAEAAEki5ADIB7urAOSMkAMgHyw8BpAzQg6AfDCSAyBnhBwA+WAkB0DOCDkA8sFIDoCcEXIAAECSCDkAACBJhBwA+WBNDoCcEXIA5IM1OQByRsgBAABJIuQAyAfTVQByRsgBkA+mqwDkjJADIB+M5ADIGSEHQD4YyQGQM0IOgHwwkgMgZ4QcAPlgJAdAzgg5APLBSA6AnBFyAABAkgg5APLBdBWAnBFyAOSD6SoAOSPkAACAJBFyAOSD6SoAOSPkAMgH01UAckbIAQAASSLkAMgH01UAckbIAQAASSLkAMgHa3IA5IyQAyAfTFcByBkhB0A+GMkBkDNCDoB8MJIDIGeEHAAAkCRCDgAASBIhBwAAJImQAyAfLDwGkDNCDoB8sPAYQM4IOQDywUgOgJwRcgDkg5EcADkj5AAAgCQRcgAAQJIIOQDywZocADkj5ADIB2tyAOSMkAMAAJJEyAGQD6arAOSMkAMgH0xXAcgZIQdAPhjJAZCzfnl/QQDNpVCQWvtJQwdK5y/G7w0ZKPXrG4M7ZB8A9ULIAVBzly9LR09JW/dKuw9J7++SLheklmKiuXBJWr1JOnZamjJWmjEhQlDp/weAWmgpFNzPAoCec21y8Jj00nvSxp3S4RMRZC4UR3A6GtAqjRwqjRkm3TxTunN+jPIQdgDUAiEHQE1cvCQ9/4709Brp+BnpzLnK/r5HckYPkz59l7RkVr3+lQCaCSEHQI+4Bjl5RvrWc9LaLdKZC9V/Lg/gDB4grVwiPXyn1K8PozoAqkfIAVA11x6ekvr7Z6V122M0pxYGtkrLF0ifWyEN6k/QAVAdtpADqDrgHDslPfpqbQOOnb0gvbZB+tWb0rkejAwBaG6EHABVcfh4ZX3skqplwCk5dU56aZ30ztb6fH4A6SPkAKhqi/j2/dKL71a+wLgSB49Lz6+NHVtMrAOoFOfkAKjY2fPSqvXSvqPZ/87wwdLkMdLSOXFOzroPpLXbuv97m3ZL72yTRg+X+lNjAagAVQaAinhE5cBx6fX3s4+uzJksfeJ2afzI+PDBgA49WUKOp6o8YrTsRql1KCckA8iOkAOg4qmqt7fEaE4WU8dJn707dmE9/Zy070j8fumKhyx2H5a275NGDGGnFYDsCDkAKnKpIL21NUZjuuM7q1beJJ2/IP34JenIieouI3ewee8DafEMqU/fav7VAJoRIQdAZp6ecmDZsT/bnx8xOE4x9poaj/wMHRS/f+Z8ZTumPHq0fme2YAUAJYQcABU5cCx72PC9VCOHFK9rWC7dd3P83Udfkd7dLu08mHFdT6H4dS/Hn2fKCkAWhBwAFTl2Mvuf9XqcaeOvbAdfszmmsFYskm6aKX3jsbitPIsLF2I0yJd6AkAWhBwAFfH270r9YnWcYOxRHIeU22+MxciLpksvrsvwCYojNxwKCKASHAYIoCL9KxhJ8UJj76o6ffbKFJdPSvZBgt4pdcPYCr823TIAFSDkAKjIqKHZ/6ynqHxasdfm9G1X2/i/fe/VroOVXdrJVBWAShByAFRk7HCpNeM2bgcZf9wxL0479qyTd1j51x7h2bI3+9edOFrq04dFxwCyY/AXQEW8cHjWJGnjzu7PvDlxRvrVGunL90v//JEIKN4ddfKs9KMXpT2Hs31Nh5v5U6Q+BBwAFSDkAMjMIcWB45bZ0sZdsbW7O5v3SN98Urp1duyqWr9DenVDhKTMCtIiHwTI2DOAChByAFTEoyneFTV8kHTsdLa/4xEbfzz2WnVfc+YkafJopqoAVIZ+EYCKOGh48fFdC6W+OYQOLza+Z6E0aGD9vxaAtBByAFQVPJbOlaaMq+/XcYbyqNH8aVI/aisAFaLaAFDVaI53S/maBl/bUC/+GisXx8gRU1UAKkXIAVAVH8y3dI501wJpUP/af34HmwdvkeZOufqMHQDIiqoDQNUGDZAeWibdOT8O66uVIQOkD98mLV/AKccAqtdSKGS6AxgAOuUaxHdKPfG69NRq6eyF7LeUd+R1N0MGSo+slG6fF7/HNBWAahFyANSMz8D54YvSgaPS6XPZw46nowYPiEMGf+NeaeKoev9LATQDQg6AmnFtcv6itHqT9Mb7cXfVidPSqbPSpcvXnpw8dKA0bJA0aYx05zxp4TSubgBQO4QcADXnSuX8BWn3IWnHAenAsQg6ntZygPHdVw4340dK08ZLE0ZJ/TLehwUAWRFyAOTi0iXp4uU4+8aBhisaANQbIQcAACSJvhQAAEgSIQcAACSJkAMAAJJEyAEAAEki5AAAgCQRcgAAQJIIOQAAIEmEHAAAkCRCDgAASBIhBwAAJImQAwAAkkTIAQAAStH/D61JEzIooGHeAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 713x492.2 with 1 Axes>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from qiskit.visualization import plot_gate_map\n",
    "\n",
    "# select fakeprovider as backend\n",
    "from qiskit_ibm_runtime.fake_provider import FakeGuadalupeV2\n",
    "\n",
    "backend = FakeGuadalupeV2()\n",
    "backend_name = backend.name\n",
    "plot_gate_map(backend)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# submit benchmark experiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_aer import AerSimulator\n",
    "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
    "from qiskit.circuit import QuantumCircuit\n",
    "\n",
    "exp_circs = {}\n",
    "qubit_indices = [0, 1, 2]\n",
    "\n",
    "exp_res = {}\n",
    "ideal_res = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. $U$=H\n",
    "### 1.1 create the circuits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pay attention to the bitstring order of original qiskit:  \n",
    "# e.g. 01 means q[1] = 0, q[0] = 1, but in the basis state, it is q[0] = 0, q[1] = 1\n",
    "\n",
    "exp_circs['H'] = {}\n",
    "\n",
    "# 1-qubit circuit\n",
    "qc = QuantumCircuit(1, len(qubit_indices[:1]))\n",
    "qc.h(qubit_indices[0])\n",
    "qc.measure_all(add_bits=False)\n",
    "\n",
    "exp_circs['H']['1-qubit'] = qc\n",
    "\n",
    "# 2-qubit circuit with 0011 encoding\n",
    "qc = QuantumCircuit(2, len(qubit_indices[:2]))\n",
    "qc.h(qubit_indices[0])\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.measure_all(add_bits=False)\n",
    "\n",
    "exp_circs['H']['2-qubit 0011'] = qc\n",
    "\n",
    "# 2-qubit circuit with 0110 encoding\n",
    "qc = QuantumCircuit(2, len(qubit_indices[:2]))\n",
    "qc.h(qubit_indices[0])\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.x(qubit_indices[1])\n",
    "qc.measure_all(add_bits=False)\n",
    "exp_circs['H']['2-qubit 0110'] = qc\n",
    "\n",
    "# 3-qubit repitition circuit\n",
    "qc = QuantumCircuit(3, len(qubit_indices))\n",
    "qc.h(qubit_indices[0])\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.cx(qubit_indices[1], qubit_indices[2])\n",
    "qc.measure_all(add_bits=False)\n",
    "exp_circs['H']['3-qubit repitition code'] = qc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## execute the circuits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## U=random 1-qubit operation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import numpy as np\n",
    "\n",
    "def one_qubit_random_circuit(qc: QuantumCircuit, target_qubit: int, gate_num: int, gate_set: list, measure: bool = True) -> QuantumCircuit:\n",
    "    \"\"\"\n",
    "    Apply a random 1-qubit operation to the target qubit\n",
    "\n",
    "    Args:\n",
    "        qc: QuantumCircuit\n",
    "        target_qubit: int\n",
    "        gate_num: int\n",
    "        gate_set: list\n",
    "        measure: bool\n",
    "\n",
    "    Returns:\n",
    "        QuantumCircuit\n",
    "    \"\"\"\n",
    "    # Get the number of qubits in the circuit\n",
    "    num_qubits = qc.num_qubits\n",
    "    \n",
    "    for _ in range(gate_num):\n",
    "        gate = random.choice(gate_set)\n",
    "        if gate == 'h':\n",
    "            qc.h(target_qubit)\n",
    "        elif gate == 'x':\n",
    "            qc.x(target_qubit)\n",
    "        elif gate == 'y':\n",
    "            qc.y(target_qubit)\n",
    "        elif gate == 'z':\n",
    "            qc.z(target_qubit)\n",
    "        elif gate == 's':\n",
    "            qc.s(target_qubit)\n",
    "        elif gate == 'rx':\n",
    "            qc.rx(random.uniform(0, 2*np.pi), target_qubit)\n",
    "        elif gate == 'ry':\n",
    "            qc.ry(random.uniform(0, 2*np.pi), target_qubit)\n",
    "        elif gate == 'rz':\n",
    "            qc.rz(random.uniform(0, 2*np.pi), target_qubit)\n",
    "\n",
    "    if measure:\n",
    "        qc.measure_all()\n",
    "\n",
    "    return qc\n",
    "\n",
    "def count2prob(counts) -> dict:\n",
    "    \"\"\"\n",
    "    Convert counts to probabilities\n",
    "\n",
    "    Args:\n",
    "        counts: dict\n",
    "\n",
    "    Returns:\n",
    "        dict\n",
    "    \"\"\"\n",
    "    total = sum(counts.values())\n",
    "    return {k: v / total for k, v in counts.items()}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pay attention to the bitstring order of original qiskit:  \n",
    "# e.g. 01 means q[1] = 0, q[0] = 1, but in the basis state, it is q[0] = 0, q[1] = 1\n",
    "\n",
    "exp_circs['random'] = {}\n",
    "gate_num = 10\n",
    "gate_set = ['h', 'x', 'y', 'z', 's', 'rx', 'ry', 'rz']\n",
    "\n",
    "# 1-qubit circuit\n",
    "qc = QuantumCircuit(1, len(qubit_indices[:1]))\n",
    "exp_circs['random']['1-qubit'] = one_qubit_random_circuit(qc, qubit_indices[0], gate_num, gate_set, measure=False)\n",
    "original_circuit = qc.copy()\n",
    "qc.measure_all(add_bits=False)\n",
    "\n",
    "\n",
    "# 2-qubit circuit with 0011 encoding\n",
    "qc = QuantumCircuit(2, len(qubit_indices[:2]))\n",
    "qc.compose(original_circuit, inplace=True)\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.measure_all(add_bits=False)\n",
    "exp_circs['random']['2-qubit 0011'] = qc\n",
    "\n",
    "# 2-qubit circuit with 0110 encoding\n",
    "qc = QuantumCircuit(2, len(qubit_indices[:2]))\n",
    "qc.compose(original_circuit, qubits=[0], inplace=True)\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.x(qubit_indices[1])\n",
    "qc.measure_all(add_bits=False)\n",
    "exp_circs['random']['2-qubit 0110'] = qc\n",
    "\n",
    "# 3-qubit repitition circuit\n",
    "qc = QuantumCircuit(3, len(qubit_indices))\n",
    "qc.compose(original_circuit, qubits=[0], inplace=True)\n",
    "qc.cx(qubit_indices[0], qubit_indices[1])\n",
    "qc.cx(qubit_indices[1], qubit_indices[2])\n",
    "qc.measure_all(add_bits=False)\n",
    "exp_circs['random']['3-qubit repitition code'] = qc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "random 1-qubit is processing...\n",
      "random 1-qubit is done!\n",
      "random 2-qubit 0011 is processing...\n",
      "random 2-qubit 0011 is done!\n",
      "random 2-qubit 0110 is processing...\n",
      "random 2-qubit 0110 is done!\n",
      "random 3-qubit repitition code is processing...\n",
      "random 3-qubit repitition code is done!\n"
     ]
    }
   ],
   "source": [
    "from qiskit.quantum_info import Statevector\n",
    "\n",
    "# Initialize the fake backend\n",
    "Aer = AerSimulator()\n",
    "backend = FakeGuadalupeV2()\n",
    "shots = int(1e5)\n",
    "\n",
    "# Create a pass manager for the backend\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
    "\n",
    "for exp_type in exp_circs.keys():\n",
    "    exp_res[exp_type] = {}\n",
    "    ideal_res[exp_type] = {}\n",
    "    for qubit_type, circuit in exp_circs[exp_type].items():\n",
    "        # Transpile the circuit\n",
    "        transpiled_circ = pm.run(circuit)\n",
    "        \n",
    "        # Execute the circuit\n",
    "        job = backend.run(transpiled_circ, shots=shots)\n",
    "        result = job.result()\n",
    "        counts = result.get_counts(transpiled_circ)\n",
    "        exp_res[exp_type][qubit_type] = count2prob(counts)\n",
    "        \n",
    "        # Get ideal probabilities using StatevectorSimulator\n",
    "        print(exp_type, qubit_type, \"is processing...\")\n",
    "        ideal_circ = circuit.copy()\n",
    "        ideal_circ.remove_final_measurements()\n",
    "        statevector = Statevector(ideal_circ)\n",
    "        probabilities = np.abs(statevector)**2\n",
    "        ideal_probs = {}\n",
    "        for i, prob in enumerate(probabilities):\n",
    "            bitstring = format(i, f'0{circuit.num_qubits}b')\n",
    "            ideal_probs[bitstring] = prob\n",
    "        ideal_res[exp_type][qubit_type] = ideal_probs\n",
    "        print(exp_type, qubit_type, \"is done!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1105.17x200.667 with 1 Axes>"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "original_circuit.measure_all(add_bits=False)\n",
    "original_circuit.draw(output='mpl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "# save the result\n",
    "import pickle\n",
    "import os\n",
    "\n",
    "SAVE_PATH = './data/qed_exp/'\n",
    "if not os.path.exists(SAVE_PATH):\n",
    "    os.makedirs(SAVE_PATH)\n",
    "\n",
    "with open(SAVE_PATH + 'exp_res.pkl', 'wb') as f:\n",
    "    pickle.dump(exp_res, f)\n",
    "\n",
    "with open(SAVE_PATH + 'ideal_res.pkl', 'wb') as f:\n",
    "    pickle.dump(ideal_res, f)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. simple qubit readout rebalancing demo "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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WbVAeHt5ISkx1jxWRp8+fbBy5cqbnvvyyy/N0FRdVlEFw1gLQxvSRS4/hYWF5qwrvx88eNDdu2Y5np6eeDSxP/x8K/9NXvH398KdjUMr/foxY8Zg8+bNmDRpEvbv34+FCxdizpw5ePnll1HX+P2MLrZu3TrExsaWev7+++8366jqMnd9j39nfFPh69q2CsPTjyWazpuqWLFihRlblDBK583o0aMxduxY1DWGkdRzOBz4aPkq7DlwtNzXSOk5JvlRhDQMglWxmuomh4+fRlGR677R1848PDwwJL4fggL9y33Nw3F9LR1EwTC6Qc7FXKQvycDM9/6FvILL7t4dSwgK8MfQhPvKXNelQxtERUbA6mwZRvkO+cWLFyMuLg6NGzc2E4BbtWplZlbMnz/fpd8xXx3rvsvC9eJiNA4NMX9kVDkdI8LRu+vdNz0XHBSAh+P7VTi4bwW2C+OlS5cwcOBADBs2DKtWrYKvry+6du2K4uJifPXVVxg5ciRyc3PdWipm7vze/P5An+5u2w+rShwQg9CQ4JLlRxLuQ6B/A9iB7cKYnJyMtWvXmjGiNWvW4NSpU6brWuYZyvSm1NRU+PhUvqu8tkrFiPDmVR5DI5iOGhlHlJIwulskOrRrBbuwVW/q1q1b0bNnT3h7e2P79u3o3LmzS7c/Z+Ey5OZVv41X7ChGXv4v75ezuVclB6aptMJr1+Dj7a2uehoc5I8Xhv+xWu+11dzU5cuXm8fExESXB1FIEC/llZ68XB35l6+4ZDv12ZWrhbATW4Vx79695jEmJqbWznrVxVKxfgiuwd+It906b0SjRo1qZfvVrX6I/6zcgP9l7TNtRZklQmTrMDZs2NA8Xrx4sVa2X902442lYva5C/jb3/9ZC3tHGrDN+KtOnTph2bJl2LRpU61s3xVtRrYVqV6EcciQIUhJSTF3+5L2o9wYyt3tAbYV65fgGrQZbTW0IZKSkrB06VIz42bRokXmaokbLxpdsGABRo0ahcDAwDrZH7YVqd6GUTpx5NZ7zsuVmjdvjrCwMDPgLxMA5L+bk5ODkJCQOpltM+u9JWaQ/9nH/8BBfqpfM3CkE2f16tVIT09H//79UVBQgB07dpgLVePj483zwcG/TaeqTZxtQ/W6ZNRk9X+3YsOWnRjxSALDSBViGOtglkgDP1937wZZAMNIpITt2oxEVsUwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBIpwTASKcEwEinBMBJBh/8DMaokNCV6qAAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 269.064x200.667 with 1 Axes>"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qc.draw(output='mpl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 352.675x200.667 with 1 Axes>"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qc_rb.draw(output='mpl')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "qubit_indices = [0]\n",
    "\n",
    "# original circuit\n",
    "gate_num = 1\n",
    "# gate_set = ['h', 'x', 'y', 'z', 's', 'rx', 'ry', 'rz']\n",
    "gate_set = ['x']\n",
    "qc = QuantumCircuit(1, 1)\n",
    "qc = one_qubit_random_circuit(qc, qubit_indices[0], gate_num, gate_set, measure=False)\n",
    "# qc.x(qubit_indices[0])\n",
    "qc.measure(qubit_indices[0], cbit=[0])  # Fixed: use integer instead of list for cbit\n",
    "qc.draw(output='mpl')\n",
    "\n",
    "\n",
    "from qiskit.quantum_info import Statevector\n",
    "from qiskit.circuit import ClassicalRegister\n",
    "\n",
    "# Initialize the fake backend\n",
    "Aer = AerSimulator()\n",
    "backend = FakeGuadalupeV2()\n",
    "shots = int(1e5)\n",
    "\n",
    "# Create a pass manager for the backend\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
    "\n",
    "transpiled_circ = pm.run(qc)\n",
    "    \n",
    "# Execute the circuit\n",
    "job = backend.run(transpiled_circ, shots=shots)\n",
    "result = job.result()\n",
    "counts = result.get_counts(transpiled_circ)\n",
    "        \n",
    "# Get ideal probabilities using StatevectorSimulator\n",
    "ideal_circ = qc.copy()\n",
    "ideal_circ.remove_final_measurements()\n",
    "statevector = Statevector(ideal_circ)\n",
    "probabilities = np.abs(statevector)**2\n",
    "ideal_probs = {}\n",
    "for i, prob in enumerate(probabilities):\n",
    "    bitstring = format(i, f'0{qc.num_qubits}b')\n",
    "    ideal_probs[bitstring] = prob\n",
    "\n",
    "# run rebalancing circuit\n",
    "# rebalance qubit 0\n",
    "qc_rb = qc.copy()\n",
    "qc_rb.remove_final_measurements()\n",
    "qc_rb.add_register(ClassicalRegister(1, 'c'))\n",
    "if counts['0'] < counts['1']:\n",
    "    qc_rb.x(qubit_indices[0])\n",
    "# qc_rb.x(qubit_indices[0])\n",
    "qc_rb.measure(qubit_indices[0], cbit=[0])\n",
    "qc_rb.draw(output='mpl')\n",
    "\n",
    "# Create a pass manager for the backend\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
    "\n",
    "transpiled_circ = pm.run(qc_rb)\n",
    "    \n",
    "# Execute the circuit\n",
    "job = backend.run(transpiled_circ, shots=shots)\n",
    "result = job.result()\n",
    "counts_rb = result.get_counts(transpiled_circ)\n",
    "        \n",
    "# Get ideal probabilities using StatevectorSimulator\n",
    "ideal_circ = qc_rb.copy()\n",
    "ideal_circ.remove_final_measurements()\n",
    "statevector = Statevector(ideal_circ)\n",
    "probabilities = np.abs(statevector)**2\n",
    "ideal_probs_rb = {}\n",
    "for i, prob in enumerate(probabilities):\n",
    "    bitstring = format(i, f'0{qc_rb.num_qubits}b')\n",
    "    ideal_probs_rb[bitstring] = prob"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TVD without rebalancing: 0.0006995596889016837\n",
      "TVD after rebalancing: 0.00043208098432165684\n"
     ]
    },
    {
     "data": {
      "image/png": "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7tU0tWrVyrp37+4yAx45csR69uzpMgCqnJek4pJLLrE77rjDTZOCrXvuuceuuuqqiForAAAAAMi1gEpp0Ldv3+4exKuEEEp/rhTmXlIJNa9T9j1PkyZNbOrUqTZ48GAbNGiQC5pmzpxpNWvWDJcZMGCAC8r0XCnVRDVt2tSNUw8C9kyZMsUFUc2bN3fjb9eunXt2lUfDlOlP6dsvv/xy9yyra665xgVyAAAAAHBCPIcqL+M5VACQc3gOFQAg3z2HCgAAAADwXwRUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAACQkwHVhAkTrHLlylakSBFr2LChLV26NN3yM2bMsGrVqrnytWrVsjlz5kR8HgqFbOjQoVa+fHkrWrSotWjRwtatWxdRZufOndapUycrXry4lSxZ0rp162b79u0Lf/7jjz9aUlJSqtdnn30WZBYBAAAAIOsDqunTp1vfvn1t2LBhtnLlSqtdu7a1bNnStm3bFrP8okWLrGPHji4AWrVqlbVt29a9Vq9eHS4zevRoGzdunE2cONGWLFlixYoVc+M8ePBguIyCqTVr1ti8efNs1qxZtnDhQuvRo0eq3/vggw/sl19+Cb/q1q2b6CwCAAAAQFySQqoeSoBqpOrXr2/jx493748fP26VKlWyXr16WUpKSqry7du3t/3797sgyNOoUSOrU6eOC6D08xUqVLB+/fpZ//793ee7d++2smXL2uTJk61Dhw62du1aq1Gjhi1btszq1avnysydO9dat25tmzdvdt9XDVWVKlVc0KZxB7Fnzx4rUaKE+33VhOW2yimzc3sSACDb/DiqTW5PAgAAmY4NEqqhOnz4sK1YscI1yQuPoEAB937x4sUxv6Ph/vKi2iev/Pr1623Lli0RZTThCty8MvqrZn5eMCUqr99WjZbf9ddfb2XKlLGmTZvaO++8k+78HDp0yC0o/wsAAAAA4pVQQLVjxw47duyYqz3y03sFRbFoeHrlvb8ZlVGQ5JecnGylSpUKlznttNNszJgxrr/W7NmzXUClpoXpBVUjR450wZv3Uk0bAAAAAMQr2fKI0qVLu75dHjVL/Pnnn+2xxx5ztVaxDBw4MOI7qqEiqAIAAACQLTVUCloKFixoW7dujRiu9+XKlYv5HQ1Pr7z3N6My0Ukvjh496jL/pfW7omaD3333XZqfFy5c2LWH9L8AAAAAIFsCqkKFCrmsefPnzw8PU1IKvW/cuHHM72i4v7woU59XXokkFBT5y6imSH2jvDL6u2vXLtd/y7NgwQL32wqa0vL555+7VOwAAAAAcEI0+VMTuS5durgEEQ0aNLCxY8e6LH5du3Z1n3fu3NkqVqzo+idJ7969rVmzZq5/U5s2bWzatGm2fPlymzRpkvtcz4rq06ePjRgxwqpWreoCrCFDhrjMfeoDJdWrV7dWrVpZ9+7dXWbAI0eOWM+ePV0GQJWTl19+2QV8F198sXv/5ptv2osvvmjPP/981i0tAAAAAMhMQKU06Nu3b3cP4lVCCKUoVwpzL6nExo0bXfY9T5MmTWzq1Kk2ePBgGzRokAuaZs6caTVr1gyXGTBggAvK9Fwp1UQpoYTGqQcBe6ZMmeKCqObNm7vxt2vXzj27yu+RRx6xDRs2uIQVepCwnpl10003JTqLAAAAAJA9z6HKy3gOFQDkHJ5DBQDId8+hAgAAAAD8FwEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEFBy0C8CAIBcMrxEbk8BAGSf4bvtZEINFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBOBlQTJkywypUrW5EiRaxhw4a2dOnSdMvPmDHDqlWr5srXqlXL5syZE/F5KBSyoUOHWvny5a1o0aLWokULW7duXUSZnTt3WqdOnax48eJWsmRJ69atm+3bty/m73333Xd2+umnu3IAAAAAcMIEVNOnT7e+ffvasGHDbOXKlVa7dm1r2bKlbdu2LWb5RYsWWceOHV0AtGrVKmvbtq17rV69Olxm9OjRNm7cOJs4caItWbLEihUr5sZ58ODBcBkFU2vWrLF58+bZrFmzbOHChdajR49Uv3fkyBH3e5dddlmiswYAAAAACUkKqXooAaqRql+/vo0fP969P378uFWqVMl69eplKSkpqcq3b9/e9u/f74IgT6NGjaxOnTougNLPV6hQwfr162f9+/d3n+/evdvKli1rkydPtg4dOtjatWutRo0atmzZMqtXr54rM3fuXGvdurVt3rzZfd/zwAMP2M8//2zNmze3Pn362K5du+Ketz179liJEiXc76smLLdVTpmd25MAANnmx1FtcnsSTl7DS+T2FABA9hm+204E8cYGCdVQHT582FasWOGa5IVHUKCAe7948eKY39Fwf3lR7ZNXfv369bZly5aIMppwBW5eGf1V8z0vmBKV12+rRsuzYMEC17xQTRIBAAAAILslJ1J4x44dduzYMVd75Kf3X3/9dczvKFiKVV7Dvc+9YemVKVOmTOSEJydbqVKlwmV+/fVXu/322+3VV1+Nu3bp0KFD7uWPQgEAAAAg32X56969u9166612+eWXx/2dkSNHutow76WmiwAAAACQLQFV6dKlrWDBgrZ169aI4Xpfrly5mN/R8PTKe38zKhOd9OLo0aMu859XRs39Hn/8cVdzpZeSYKi9o/7/4osvxpy2gQMHujLea9OmTYksDgAAAAD5XEIBVaFChaxu3bo2f/788DAlpdD7xo0bx/yOhvvLizL1eeWrVKnigiJ/GTW9U98or4z+KrmE+m95FEDpt9XXyutn9fnnn4dfDz/8sEudrv/feOONMaetcOHCrnmg/wUAAAAA2dKHSpQyvUuXLi5BRIMGDWzs2LEui1/Xrl3d5507d7aKFSu65nTSu3dva9asmY0ZM8batGlj06ZNs+XLl9ukSZPc50lJSS4b34gRI6xq1aouwBoyZIjL3Kf06lK9enVr1aqVa9anzIBKjd6zZ0+XAdDL8KcyfvoNJa2oWbNmorMIAAAAANkTUCkN+vbt292DeJUQQunPlcLcSyqxceNGF8h4mjRpYlOnTrXBgwfboEGDXNA0c+bMiEBnwIABLijTc6VUE9W0aVM3Tj0I2DNlyhQXRCkdusbfrl079+wqAAAAADhpnkOVl/EcKgDIOTyHKhN4DhWAvGx4Hn4OFQAAAADgvwioAAAAACAgAioAAAAACIiACgAAAAACIqACAAAAgIAIqAAAAAAgIAIqAAAAAAiIgAoAAAAAAiKgAgAAAICACKgAAAAAICACKgAAAAAIiIAKAAAAAAIioAIAAACAgAioAAAAACAgAioAAAAACIiACgAAAAACIqACAAAAgIAIqAAAAAAgIAIqAAAAAAiIgAoAAAAAAiKgAgAAAICACKgAAAAAICACKgAAAAAIiIAKAAAAAAIioAIAAACAgAioAAAAACAgAioAAAAACIiACgAAAAACIqACAAAAgIAIqAAAAAAgIAIqAAAAAAiIgAoAAAAAAiKgAgAAAICACKgAAAAAICACKgAAAAAIiIAKAAAAAAIioAIAAACAgAioAAAAACAgAioAAAAACIiACgAAAAACIqACAAAAgIAIqAAAAAAgJwOqCRMmWOXKla1IkSLWsGFDW7p0abrlZ8yYYdWqVXPla9WqZXPmzIn4PBQK2dChQ618+fJWtGhRa9Giha1bty6izM6dO61Tp05WvHhxK1mypHXr1s327dsX/vybb76xK6+80sqWLet+55xzzrHBgwfbkSNHgswiAAAAAGR9QDV9+nTr27evDRs2zFauXGm1a9e2li1b2rZt22KWX7RokXXs2NEFQKtWrbK2bdu61+rVq8NlRo8ebePGjbOJEyfakiVLrFixYm6cBw8eDJdRMLVmzRqbN2+ezZo1yxYuXGg9evQIf37KKadY586d7f3333fB1dixY+25555z0wkAAAAA2SEppOqhBKhGqn79+jZ+/Hj3/vjx41apUiXr1auXpaSkpCrfvn17279/vwuCPI0aNbI6deq4AEo/X6FCBevXr5/179/ffb57925X0zR58mTr0KGDrV271mrUqGHLli2zevXquTJz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tmxZmzx5snXo0MHWrl1rNWrUsGXLllm9evVcmblz51rr1q1t8+bN7vt+qqnatWuXzZw5M6GFsWfPHitRooT7fdWE5bbKKbNzexIAINv8OKpNbk/CyWt4idyeAgDIPsN324kg3tggoRqqw4cP24oVKyJqgAoUKODeL168OOZ3NDy6xki1T1759evX25YtWyLKaMIVuHll9FfN/LxgSlRev60aLQAAAADIDcmJFN6xY4drWqfaIz+9//rrr2N+R8FSrPIa7n3uDUuvTJkyZSInPDnZSpUqFS4TxKFDh9zLH4UCAAAAQLzydZa/kSNHutow76WmiwAAAACQLQFV6dKlrWDBgrZ169aI4Xpfrly5mN/R8PTKe38zKhOd9OLo0aMu819avxuPgQMHujaR3mvTpk2BxwUAAAAg/0kooCpUqJDVrVvX5s+fHx6mpBR637hx45jf0XB/eVGmPq98lSpVXFDkL6Omd+ob5ZXRXyWZUP8tz4IFC9xvq69VUIULF3YdzPwvAAAAAMiWPlSilOldunRxCSIaNGhgY8eOdVn8unbt6j7v3LmzVaxY0TWnk969e1uzZs1szJgx1qZNG5s2bZotX77cJk2a5D5PSkqyPn362IgRI6xq1aouwBoyZIjL3Oc9S6p69erWqlUr6969u8sMeOTIEevZs6fLAOjP8PfVV1+5xBmqudq7d699/vnnbrgyCgIAAABArgdUSoO+fft29yBeJYRQsKIU5l5SiY0bN7rse54mTZrY1KlTbfDgwTZo0CAXNCmdec2aNcNlBgwY4IIyPVdKNVFNmzZ149SDgD1TpkxxQVTz5s3d+Nu1a+eeXeWnNOobNmwIv7/44ovd3wQzwwMAAABA9jyHKi/jOVQAkHN4DlUm8BwqAHnZ8Dz8HCoAAAAAwH8RUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQEAEVAAAAAAQEAEVAAAAAAREQAUAAAAAARFQAQAAAEBABFQAAAAAEBABFQAAAAAEREAFAAAAAAERUAEAAABAQARUAAAAABAQARUAAAAABERABQAAAAABEVABAAAAQE4GVBMmTLDKlStbkSJFrGHDhrZ06dJ0y8+YMcOqVavmyteqVcvmzJkT8XkoFLKhQ4da+fLlrWjRotaiRQtbt25dRJmdO3dap06drHjx4layZEnr1q2b7du3L6LMF198YZdddpn7nUqVKtno0aODzB4AAAAAZE9ANX36dOvbt68NGzbMVq5cabVr17aWLVvatm3bYpZftGiRdezY0QVAq1atsrZt27rX6tWrw2UU+IwbN84mTpxoS5YssWLFirlxHjx4MFxGwdSaNWts3rx5NmvWLFu4cKH16NEj/PmePXvs6quvtrPPPttWrFhhjz32mA0fPtwmTZqU6CwCAAAAQFySQqoeSoBqpOrXr2/jx493748fP+5qg3r16mUpKSmpyrdv397279/vgiBPo0aNrE6dOi6A0s9XqFDB+vXrZ/3793ef796928qWLWuTJ0+2Dh062Nq1a61GjRq2bNkyq1evniszd+5ca926tW3evNl9/9lnn7UHH3zQtmzZYoUKFXJlND0zZ860r7/+Oq55U1BWokQJ9/uqCcttlVNm5/YkAEC2+XFUm9yehJPX8BK5PQUAkH2G77YTQbyxQXIiIz18+LCr/Rk4cGB4WIECBVwTvcWLF8f8joarRstPtU8KdGT9+vUuCNI4PJpwBW76rgIq/VUzPy+YEpXXb6tG68Ybb3RlLr/88nAw5f3Oo48+ar/99pv94Q9/SDVthw4dci+PFpa38E4Exw8dyO1JAIBsc6Ica09KhxK6FwoAJ5c9e06o81RG9U8JBVQ7duywY8eOudojP71PqxZIwVKs8hrufe4NS69MmTJlIic8OdlKlSoVUaZKlSqpxuF9FiugGjlypD300EOphqvGDQCQvUqMze0pAACckEadWLXwe/fudRU+WRJQ5TWqafPXnqn5opJfnHHGGZaUlJSr05afKPpXELtp06YToqllfsV6ODGwHnIf6+DEwHo4MbAeTgysh9yhmikFU+pelJ6EAqrSpUtbwYIFbevWrRHD9b5cuXIxv6Ph6ZX3/mqYsvz5y6iflVcmOunF0aNHXfDjH0+s3/H/RrTChQu7l5+aFiJ36ADBQSL3sR5ODKyH3Mc6ODGwHk4MrIcTA+sh56VXMxUoy5/6J9WtW9fmz58fUauj940bN475HQ33lxdl6vPKq5meAh5/GUXh6hvlldHfXbt2uf5bngULFrjfVl8rr4wy/x05ciTidy644IKYzf0AAAAAIMfTpquJ3HPPPWcvv/yyy7531113uSx+Xbt2dZ937tw5ImlF7969XUa+MWPGuH5WSmW+fPly69mzp/tcTev69OljI0aMsHfeece+/PJLNw5VrSm9ulSvXt1atWpl3bt3d8+8+vTTT933lbDCq4K79dZbXcCn9OxKr6707k899VSqhBgAAAAAkFUS7kOlNOjbt293D+JVsgc1y1PA5CWA2Lhxo8u+52nSpIlNnTrVBg8ebIMGDbKqVau6DH81a9YMlxkwYIALyvRcKdVENW3a1I1TD+j1TJkyxQVRzZs3d+Nv166de3aVvzru/ffft3vuucfVoql5oqbR/6wqnJjU7FLPNYtufomcxXo4MbAech/r4MTAejgxsB5ODKyHPPYcKgAAAABAwCZ/AAAAAID/Q0AFAAAAAAERUAEAAABAQARUAAAAABAQARWynR7A3KlTJ/cgOj04Want9+3bl275Xr16uWeIFS1a1M466yy79957bffu3RHllHI/+jVt2rQcmKOTw4QJE6xy5couW6ae16ZHDqRnxowZVq1aNVe+Vq1aNmfOnIjPlb9GmTP1AG6tlxYtWti6deuyeS7y13rQIykuu+wy9+w8vbSMo8vffvvtqbZ7PVYCWbceJk+enGoZ+7POCvtD9q+HK664IuZxvk2bNuEy7A+J0fM6r7vuOvfIGS0rZV3OyEcffWSXXHKJyy533nnnuf0js+eb/C7R9fDmm2/aVVddZWeeeaa7ltKzV997772IMnosUfS+oHM6cgYBFbKdgik9G0wPWp41a5Y7kKSXzv7nn392r8cff9xWr17tDt5Ko69ALNpLL71kv/zyS/jlPbssv9Nz2PQMNqVYXblypdWuXdtatmxp27Zti1l+0aJF1rFjR7eMV61a5ZajXlr+ntGjR7tHFUycONE9eLtYsWJunAcPHszBOcvb60EXLloPH374oS1evNgqVapkV199tf30008R5XTB6N/uX3vttRyao/yxHkQXLf5lvGHDhojP2R+yfz3oItK/DnQ8KliwoN18880R5dgf4qdH1Gi5KwCKx/r1610Ae+WVV9rnn3/unht65513RlzMB9m/8rtE14OumxRQ6UbnihUr3PpQQKbztd+FF14YsS988skn2TQHSEVp04Hs8tVXXyktf2jZsmXhYe+++24oKSkp9NNPP8U9ntdffz1UqFCh0JEjR8LDNN633nory6c5L2jQoEHonnvuCb8/duxYqEKFCqGRI0fGLH/LLbeE2rRpEzGsYcOGob/85S/u/8ePHw+VK1cu9Nhjj4U/37VrV6hw4cKh1157LdvmI7+th2hHjx4NnX766aGXX345PKxLly6hG264IVumN69KdD289NJLoRIlSqQ5PvaH3NkfnnzySbc/7Nu3LzyM/SG4eM6hAwYMCF144YURw9q3bx9q2bJllq3X/C7otUyNGjVCDz30UPj9sGHDQrVr187iqUO8qKFCttJddjXzq1evXniYmsbo4cy6qxsvNffTHePk5MhnUetBznqIc4MGDezFF190zXDyu8OHD7s7WFrOHi1vvdf6iEXD/eVFdxi98rpLqQd5+8voYdpq2pHWOPO7IOsh2oEDB+zIkSNWqlSpVDVZZcqUcc1i77rrLvv111+zfPrz+3pQs+Szzz7b1RLecMMNrpbdw/6QO/vDCy+8YB06dHC1gX7sD9kno3NDVqxXJO748eO2d+/eVOcGNTtWM8JzzjnHtQ7auHFjrk1jfkNAhWyliw6d6PwUFOkgoM/isWPHDnvkkUdSNRN8+OGH7fXXX3dNCdu1a2d33323Pf3005bfaXkdO3bMypYtGzFc79Na5hqeXnnvbyLjzO+CrIdoDzzwgDs5+i9W1LzplVdesfnz59ujjz5qH3/8sV1zzTXut5A160EX5rpB8/bbb9urr77qLl6aNGlimzdvdp+zP+T8/qA+OWryp+ZmfuwP2Sutc8OePXvs999/z5LjHBKnLhG66XPLLbeEh+mGjtdF4tlnn3U3ftQnV4EXsl/k7X4gTikpKe7klZ61a9dm+nd00Fb77Ro1argOl35DhgwJ///iiy92bZIfe+wxl8ACONmNGjXKJVnR3Xd/QgTdofcoechFF11k5557rivXvHnzXJravEUdvvXyKJiqXr26/f3vf3c3d5DzVDul7V2tEfzYH5DfTJ061R566CF3w8d/w1o3EjzaDxRgqZZdN55j9UFH1qKGCoH069fPBUzpvVTlXK5cuVQdU48ePeoy+emz9Oiuiu4+nn766fbWW2/ZKaeckm55HTx0B/nQoUOWn6kJpDpub926NWK43qe1zDU8vfLe30TGmd8FWQ/+u48KqN5//313YkyP9jP91nfffZcl053XZGY9eHTs0U0bbxmzP+TsetDNMt1ciOeikP0ha6V1blATfGW3zIr9C/HTfqBaWgVJ0U0xo6m7xfnnn8++kEMIqBCIUncqHWd6r0KFCrm7vLt27XJtrD0LFixwTWgUAKVXM6XsZhrHO++8kyplcSzKQKRU00rtmp9pmdWtW9c1gfFoeeu9/667n4b7y4uaUnrlq1Sp4k6O/jJaR+oHl9Y487sg68HLHqdaEDXb8Pc9TItuIqjPiNJ3I+vWg5+aNH355ZfhZcz+kLPrQY900I2yP//5zxn+DvtD1sro3JAV+xfio+yVXbt2dX/9jw5Ii5oEfv/99+wLOSXu9BVAQK1atQpdfPHFoSVLloQ++eSTUNWqVUMdO3YMf7558+bQBRdc4D6X3bt3uwxztWrVCn333XehX375JfxS1jN55513Qs8991zoyy+/DK1bty70zDPPhE499dTQ0KFDc20+TyTTpk1zGccmT57sMi326NEjVLJkydCWLVvc57fddlsoJSUlXP7TTz8NJScnhx5//PHQ2rVrXbagU045xS1fz6hRo9w43n777dAXX3zhMmtVqVIl9Pvvv+fKPObF9aBlrGyW//znPyO2+71797rP9bd///6hxYsXh9avXx/64IMPQpdcconbpw4ePJhr85nX1oMyZ7333nuh77//PrRixYpQhw4dQkWKFAmtWbMmXIb9IfvXg6dp06Yus1w09ofEaZmtWrXKvXQJ+MQTT7j/b9iwwX2u5a/14Pnhhx/cufX+++9354YJEyaEChYsGJo7d27c6xWZXw9Tpkxx52gtf/+5QdlFPf369Qt99NFHbl/QOb1Fixah0qVLh7Zt25Yr85jfEFAh2/36668ugDrttNNCxYsXD3Xt2jV8gSja+XVA+fDDD917/dX7WC+V9VKv16lTx42zWLFiLlXoxIkTXbpW/J+nn346dNZZZ7kLdKW1/eyzz8KfNWvWzKUbjk5Nf/7557vySpM7e/bsVKmihwwZEipbtqw7eTZv3jz0zTff5Nj85If1cPbZZ8fc7hXgyoEDB0JXX3116Mwzz3QBr8p3796dC5csXg99+vQJl9X23rp169DKlSsjxsf+kDPHpa+//trtA++//36qcbE/JC6t86u33PVX6yH6Ozrfap2dc8457rECiaxXZH496P/plRfddChfvrxbBxUrVnTvdVMaOSNJ/+RYdRgAAAAA5CH0oQIAAACAgAioAAAAACAgAioAAAAACIiACgAAAAACIqACAAAAgIAIqAAAAAAgIAIqAAAAAAiIgAoAAAAAAiKgAgAAAICACKgAAAAAICACKgAAAAAIiIAKAAAAACyY/wfwQD1+dWhDHAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = np.array([counts['0'], counts['1']]) / shots\n",
    "t = np.array([ideal_probs['0'], ideal_probs['1']])\n",
    "m_rb = np.array([counts_rb['0'], counts_rb['1']]) / shots\n",
    "t_rb = np.array([ideal_probs_rb['0'], ideal_probs_rb['1']])\n",
    "\n",
    "M = np.load(r\"./data\\benchmark_matrix_fake_guadalupe\\1-qubit\\transition_matrix_q0.npy\", allow_pickle=True)\n",
    "M = M.item()['transition_matrix']\n",
    "t_prime = np.linalg.inv(M) @ m\n",
    "t_prime_rb = np.linalg.inv(M) @ m_rb\n",
    "\n",
    "tvd_no_rb = np.sum(np.abs(t_prime - t))/2\n",
    "tvd_rb = np.sum(np.abs(t_prime_rb - t_rb))/2\n",
    "\n",
    "print(f\"TVD without rebalancing: {tvd_no_rb}\")\n",
    "print(f\"TVD after rebalancing: {tvd_rb}\")\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure(figsize=(10, 5))\n",
    "\n",
    "plt.bar(0, tvd_no_rb, label='original')\n",
    "plt.bar(1, tvd_rb, label='rebalancing method')\n",
    "plt.title('1-qubit TVD comparison after MI without rebalancing and with rebalancing')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# save the result\n",
    "import pickle\n",
    "import os\n",
    "\n",
    "SAVE_PATH = './data/qed_rebalancing/'\n",
    "if not os.path.exists(SAVE_PATH):\n",
    "    os.makedirs(SAVE_PATH)\n",
    "\n",
    "with open(SAVE_PATH + 'exp_res_q0.pkl', 'wb') as f:\n",
    "    pickle.dump(exp_res, f)\n",
    "\n",
    "with open(SAVE_PATH + 'ideal_res_q0.pkl', 'wb') as f:\n",
    "    pickle.dump(ideal_res, f)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.21"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
